package com.example.spring.test;

/**
 * volatile关键字作用
 * 1.某个线程修改了被volatile关键字修饰变量是，根据数据一致性的协议，通过信号量，更改其他线程的高速缓存中volatile关键字修饰变量状态为无效状态，
 * 其他线程如果需要重写读取该变量会再次从主内存中读取，而不是读取自己的高速缓存中的。
 * <p>
 * 2.被volatile关键字修饰变量不会指令重排序。
 * <p>
 * 3.volatile不能保证原子性,能够保证可见性和防止指令重排
 */
public class NoVisibility {
    private volatile int inc = 0;

    public synchronized void increase() {
        inc++;
    }

    public static void main(String[] args) throws InterruptedException {
        final NoVisibility test = new NoVisibility();
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    test.increase();
                }
            }).start();
        }

        Thread.sleep(3000);
        System.out.println(test.inc);
    }

}





